package Git2024_5_21;

public class Enum {
    /**
     * Knife4j
     * 1.开发过程中进行功能测试
     * 2.生成API文档 提供给前端供设计使用
     *
     * 使用流程
     * 1.手动添加依赖 刷新Maven
     * 2.创建配置类config.Knife4jConfig 指定Controller路径
     * 3.重启工程进入浏览器访问
     * 4.进行一系列测试
     *
     * Knife4j常用注解
     * @Api
     * @ApiOperation
     * @ApiModelProperty
     * @ApiIgnore
     * @ApiImplicitPar
     * @ApiImplicitPars
     *
     * Lombok
     * 1.消除模板代码
     * 2.提供了日志功能 设置日志级别 控制终端日志的输出
     *
     * 使用流程
     * 1.添加依赖 刷新maven
     * 2.配置文件中配置日志级别
     * 3.类上添加@Slf4j 方法中使用log.Xxx()使用即可
     *
     * Lombok常用注解
     * @Setter
     * @Getter
     * @ToString
     * @AllArgsConstructor
     * @Slf4j
     *
     * Spring
     * 资源整合框架 可以整合自身和第三方框架
     * 第三方
     * Mybatis框架
     * 核心
     * Spring Framework
     *
     * Spring Framework的核心
     * IoC控制反转
     * AOP面向切面编程
     * Spring MVC
     *
     * IoC是如何实现的
     * IoC是一种控制反转的思想
     * 1.IoC容器
     * 2.DI依赖注入
     *
     * IoC容器如何创建
     * 1.使用ApplicationContext接口
     *
     * IoC容器的创建方式
     * 1.注解方式
     * 2.XML文件方式
     *
     * Spring Framework常用注解
     * @Component
     * @Value
     * @Autowired
     * @Scope
     * @PostContruct 生命周期初始化
     * @PreDest
     * @PropertyScource
     * @ComponentScan
     *
     * Mybatis框架的注解
     * @Select 查
     * @Delete 删
     * @Insert 增
     * @Update 改
     * @Mapper
     *
     * Spring MVC的注解(Spring Boot子模块 用于快速开发WEB应用程序)
     * @Controller
     * @RequestMapping
     * @RequestBody
     * @ResponseBodt
     * @PathV 路径中传参
     *
     * 全局异常处理器的注解(SpringMVC提供的组件)
     * @ControllerAdvice
     * @ExceptionHandler
     * @RestControllerAdvice
     *
     * 使用流程
     * 1.创建全局异常处理器的类 GlobalExceptionHandler
     * 2.创建异常处理方法
     */
    /**
     * 统一结果返回设置流程
     * 1.自定义枚举类
     * 2.创建统一结果返回的类 两个构造方法(有无具体数据返回) 两个静态方法(操作成功的场景)
     * 3.controller中使用
     */
    /**
     * Knife4j
     * 1. 功能测试工具：用于验证API的功能和性能
     * 2. 文档生成器：自动生成API文档，方便前端开发

     * 使用步骤
     * 1. 添加依赖并刷新Maven仓库
     * 2. 创建配置类（使用@Configuration注解）
     * 3. 重启应用，访问文档页面
     * 4. 开始测试

     * 常用注解
     * `@Api`: 标识API接口
     * `@ApiOperation`: 描述API的操作
     * `@ApiModelProperty`: 描述数据模型属性
     * `@ApiIgnore`: 忽略特定API
     * `@ApiImplicitParam`: 单个参数描述
     * `@ApiImplicitParams`: 多个参数描述

     * Lombok
     * 1. 自动化代码生成：减少getter、setter等模板代码
     * 2. 日志支持：简化日志记录，通过`@Slf4j`注解

     * 使用步骤
     * 1. 添加Lombok依赖
     * 2. 配置日志级别
     * 3. 使用`@Slf4j`注解，通过`log`对象记录日志

     * Lombok常用注解
     * `@Setter`: 自动生成setter方法
     * `@Getter`: 自动生成getter方法
     * `@ToString`: 自动生成toString方法
     * `@AllArgsConstructor`: 自动生成全参构造方法
     * `@NoArgsConstructor`: 自动生成无参构造方法
     * `@Data`: 自动生成所有getter和setter
     * `@Slf4j`: 提供日志记录功能

     * Spring
     * - 整合框架：管理依赖和服务
     * - 核心组件：Spring Framework

     * Spring核心概念
     * - IoC（控制反转）：依赖由容器管理
     * - AOP（面向切面编程）：实现横切关注点
     * - Spring MVC：Web应用程序框架

     * IoC实现
     * - IoC容器：负责对象的创建和依赖关系的管理
     * - DI（依赖注入）：通过容器将依赖注入到目标对象

     * 创建IoC容器
     * - 注解配置：使用`@Configuration`注解
     * - XML配置：通过XML文件定义配置

     * Spring常见注解
     * `@Component`: 标记为Spring Bean
     * `@Value`: 注入属性值
     * `@Autowired`: 自动装配依赖
     * `@Scope`: 定义Bean的作用范围
     * `@PostConstruct`: 初始化方法
     * `@PreDestroy`: 销毁方法
     * `@PropertySource`: 引入属性源
     * `@ComponentScan`: 自动扫描组件

     * Mybatis注解
     * `@Select`: SQL查询
     * `@Delete`: 数据删除
     * `@Insert`: 数据插入
     * `@Update`: 数据更新
     * `@Mapper`: 标记Mapper接口

     * Spring MVC注解
     * `@Controller`: 标记控制器
     * `@RequestMapping`: 映射HTTP请求
     * `@RequestBody`: 将请求体转换为Java对象
     * `@ResponseBody`: 将Java对象转换为响应体
     * `@PathVariable`: 获取URL路径变量

     * 异常处理器
     * `@ControllerAdvice`: 全局异常处理
     * `@ExceptionHandler`: 处理特定类型的异常
     * `@RestControllerAdvice`: 对RESTful API的全局异常处理

     * 使用流程
     * 1. 创建异常处理器类，使用`@ControllerAdvice`
     * 2. 在方法上使用`@ExceptionHandler`注解
     */

    /*---------------------------------------------------正课----------------------------------------------------*/
    // 全局异常处理器
    /**
     * 异常处理规则:
     * 1.当自定义全局处理器中未定义该异常 而是定义了一个父类的异常时 父类异常也能处理子类的异常
     * 2.当父类异常与子类异常同时定义在全局异常处理器中时 会优先使用子类即更为精准的异常处理方法
     *
     * 当第三方框架抛出异常时 必须使用全局异常处理器处理[框架源码机制不满足即会抛异常-不兼容]
     */
    /**
     * 异常处理的兜底方法:
     * Throwable方法
     *  最好在程序写完后再添加 否则开发时无论什么异常都会被其捕获 无法精准排错
     */
    /**
     * 全局异常处理器
     * @ControllerAdvice
     * @ExceptionHandler
     * @RestControllerAdvice
     */
    // 验证框架 Spring Validation
    /**
     * 第三方框架: 数据合法性校验
     * 1.手动规定校验逻辑
     * 2.主流第三方校验框架 通过注解实现校验 例如 Spring Validation
     *
     * 同一个工程 前端和后端的校验规则是一致的
     *  * 前端通过.JS文件校验
     *      JS在用户进入某页面时就拉取到用户本地了 因此无需联网也能完成校验 效率高
     *  * 后端作为最后防线 也要进行校验 防止用户通过漏洞编辑不合法信息
     *
     * Spring Validation 的使用:
     * 1.创建工程时勾选依赖即可
     * 2.在参数前加上@Validated注解 标识该参数 即说明该参数会被校验
     * 3.校验指定数据 在属性上添加依赖即可
     *  3.1 如@NotNull 表示该属性不能为空值
     *  3.2 也可以自定义提示消息message:@NotNull(message="自定义提示消息")
     *  3.3 默认提示消息为抛出 MethodArgumentNotValidException 方法参数无效异常及其具体错误信息
     *  3.4 通过方法 ex.getFieldError().getDefaultMessage() 即可简化错误信息 只输出默认提示消息或自定义的提示消息
     * 4.使用全局异常处理器定义该异常的处理方式[Spring Validation的黄金搭档,密不可分]
     */
    /*
<!-- Spring Boot支持Spring Validation的依赖项，用于检查参数的基本有效性 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>
     */
    /**
     * 常用校验注解(效果可以累加 即一个参数或属性能被多个注解标注)
     * @NotNull(message="")  不允许有 空值
     * @NotEmpty(message="") 不允许有 空值 空字符串
     * @NotBlank(message="") 不允许有 空值 空字符串 空白串
     * @Size(min=X,max=Xxx,message="")  参数长度(包含最小值和最大值)
     * @Range(min=X,max=Xxx,message="参数范围必须在{min}到{max}之间") 约束输入数据的范围(包含最小值和最大值)
     *  小知识:若想在上述注解中加入参数的值 可以使用例如{min},{max}这样形式的占位符
     */
    /**
     * 万能校验方式:
     * 正则表达式
     *  适用于复杂校验环境
     * @Pattern(regexp="正则表达式[^开头$结尾]",message="错误提示消息")
     */

    /**
     * POJO类
     * 1.添加依赖 刷新Maven
     * 2.在属性上添加对应的校验注解 [在POJO类的属性上添加对应的验证注解]
     * 3.创建校验器 [如果需要自定义复杂的校验逻辑 可以创建一个自定义的校验注解和对应的校验器实现]
     * 4.在服务类中进行校验 [在处理用户输入或业务逻辑的地方 使用`Validator`来验证你的POJO实例]
     * 5.结果处理 全局异常处理器
     */
    /**
     * 非POJO类
     * 声明参数接收
     * 前提: 需要先在当前控制器所在的类上添加 @Validated
     * 1.在当前控制器所在的类上添加 @Validated
     * 2.在参数前添加对应的校验注解
     *      例如 @Range(min="",max="",message="提示消息")
     * 此时出现问题 1 :
     *  测试时因为Knife4j框架与校验框架的冲突 导致参数无法在测试界面显示
     *  可以在参数前添加 @RequestParam(value="请求参数名") 注解 声明当前参数为请求参数
     *  注意:虽然该注解的赋值规则为:先将值赋给`请求参数名`,`请求参数名`再将值赋给被标注的参数,因此二者之间可以不同名
     *      但是不提倡 若不同名 请求地址处的`查询参数名`需要与`请求参数名`同名才可
     * 3.编写异常处理器的方法
     * 此时出现问题 2 :
     *  返回的数据较为冗余 例如:
     *   "data": "selectById.id: ID值必须在200~300之间"
     * 处理方法:
     * --在异常处理器对应方法中进行--
     *  使用split("分割依据")方法对返回信息进行切割
     *  使用[数字]方式进行取舍
     *      取舍规则为 在split("分割依据")[数字]方法后的`[数字]`表示分割后对第n+1个元素进行检索/获取
     *      可以理解为 被该方法分割后的字段被分为元素储存在特定的字符串数组中 拿取时按照下标规则拿取
     *      即[0]表示第一个元素 [1]表示第二个元素 以此类推
     *  使用trim()方法去除多余的空白字符
     *   String message = ex.getMessage().split(":")[1].trim();
     */
    /**
     * 当请求参数有多个时 需要在每个参数前添加@Param("控制器传入XML映射文件的参数的对应参数名")
     */
    // AI帮写 看不懂我写的可以参考下AI的笔记 也可以复制进word文档变为markdown格式 或许不行 我没试过不知道
    /**
         * 非POJO类参数校验
         * 前提: 在当前控制器类上添加 @Validated 注解
         * 1. 在控制器类上添加 @Validated 注解启用校验
         * 2. 在需要校验的参数前添加相应的校验注解，如 @Range(min="", max="", message="提示消息")
             * 示例: @Range(min=200, max=300, message="ID值必须在200~300之间")
             * 解决问题:
               - 测试时，由于Knife4j框架与校验框架的冲突，参数可能无法在测试界面显示
               - 可在参数前添加 @RequestParam(value="请求参数名") 注解声明为请求参数
                 - 注意: 尽管`请求参数名`和被注解参数名可以不同，但为了保证请求正常，建议保持一致

         * 3. 编写异常处理器
             * 问题: 返回的错误信息过于详细，例如:
               - {"data": "selectById.id: ID值必须在200~300之间"}
             * 解决方法:
               - 在异常处理器中处理异常信息
                 - 使用`split(":")[1]`获取错误信息的第二部分，这通常包含具体的错误描述
                 - 示例代码:
                    这里，`split(":")[1]`将异常消息按冒号分割，选取第二部分（索引1）的错误描述，并使用`.trim()`去除前后空格，得到简洁的错误提示。

 */

}
